home *** CD-ROM | disk | FTP | other *** search
/ Delphi Developer's Kit 1996 / Delphi Developer's Kit 1996.iso / power / csystray.000 / csystray / systrdlg.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1995-12-22  |  9.4 KB  |  390 lines

  1. // systrdlg.cpp : implementation file
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include "systray.h"
  6. #include "systrdlg.h"
  7. #include "aboutdlg.h"
  8. #include "devnotes.h"
  9.  
  10. #ifdef _DEBUG
  11. #undef THIS_FILE
  12. static char BASED_CODE THIS_FILE[] = __FILE__;
  13. #endif
  14.  
  15. #define ID_MYSYSTRAYITEM        42
  16.  
  17.  
  18. /////////////////////////////////////////////////////////////////////////////
  19. // CSystrayDlg dialog
  20.  
  21. CSystrayDlg::CSystrayDlg(CWnd* pParent /*=NULL*/)
  22.     : CDialog(CSystrayDlg::IDD, pParent)
  23. {
  24.     //{{AFX_DATA_INIT(CSystrayDlg)
  25.     m_szBubbleText = _T("");
  26.     m_bEnable = FALSE;
  27.     m_nIconState = 0;
  28.     m_bCycle = FALSE;
  29.     m_bLoadOnStartup = FALSE;
  30.     //}}AFX_DATA_INIT
  31.     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  32.     m_uMyTimer = 0;
  33. }
  34.  
  35. void CSystrayDlg::DoDataExchange(CDataExchange* pDX)
  36. {
  37.     CDialog::DoDataExchange(pDX);
  38.     //{{AFX_DATA_MAP(CSystrayDlg)
  39.     DDX_Control(pDX, IDE_BUBBLETEXT, m_editBubbleText);
  40.     DDX_Control(pDX, IDCK_ENABLE, m_ckEnable);
  41.     DDX_Text(pDX, IDE_BUBBLETEXT, m_szBubbleText);
  42.     DDV_MaxChars(pDX, m_szBubbleText, 63);
  43.     DDX_Check(pDX, IDCK_ENABLE, m_bEnable);
  44.     DDX_Radio(pDX, IDRB_ICONSTATE, m_nIconState);
  45.     DDX_Check(pDX, IDCK_CYCLE, m_bCycle);
  46.     DDX_Check(pDX, IDCK_LOADONSTARTUP, m_bLoadOnStartup);
  47.     //}}AFX_DATA_MAP
  48. }
  49.  
  50. BEGIN_MESSAGE_MAP(CSystrayDlg, CDialog)
  51.     //{{AFX_MSG_MAP(CSystrayDlg)
  52.     ON_WM_SYSCOMMAND()
  53.     ON_WM_PAINT()
  54.     ON_WM_QUERYDRAGICON()
  55.     ON_BN_CLICKED(IDABORT, OnHide)
  56.     ON_BN_CLICKED(IDB_SET, OnSet)
  57.     ON_BN_CLICKED(IDCK_ENABLE, OnEnable)
  58.     ON_BN_CLICKED(IDRB_ICONSTATE, OnIconstate)
  59.     ON_MESSAGE(WM_MYCALLBACK, OnMySystemTrayCallback)
  60.     ON_BN_CLICKED(IDCK_CYCLE, OnCycle)
  61.     ON_BN_CLICKED(IDB_CLEAR, OnClear)
  62.     ON_WM_TIMER()
  63.     ON_WM_CLOSE()
  64.     ON_BN_CLICKED(IDB_ABOUT, OnAbout)
  65.     ON_WM_QUERYENDSESSION()
  66.     ON_BN_CLICKED(IDC_RADIO2, OnIconstate)
  67.     ON_BN_CLICKED(IDC_RADIO3, OnIconstate)
  68.     ON_BN_CLICKED(IDC_RADIO4, OnIconstate)
  69.     ON_BN_CLICKED(IDC_RADIO5, OnIconstate)
  70.     ON_BN_CLICKED(IDC_RADIO6, OnIconstate)
  71.     ON_BN_CLICKED(IDC_RADIO7, OnIconstate)
  72.     ON_BN_CLICKED(IDC_RADIO8, OnIconstate)
  73.     ON_BN_CLICKED(IDC_RADIO9, OnIconstate)
  74.     ON_BN_CLICKED(IDC_RADIO10, OnIconstate)
  75.     ON_BN_CLICKED(IDC_RADIO11, OnIconstate)
  76.     ON_BN_CLICKED(IDC_RADIO12, OnIconstate)
  77.     ON_BN_CLICKED(IDC_RADIO13, OnIconstate)
  78.     ON_BN_CLICKED(IDC_RADIO14, OnIconstate)
  79.     ON_BN_CLICKED(IDC_RADIO15, OnIconstate)
  80.     ON_BN_CLICKED(IDC_RADIO16, OnIconstate)
  81.     ON_BN_CLICKED(IDB_DEVNOTES, OnDevnotes)
  82.     //}}AFX_MSG_MAP
  83. END_MESSAGE_MAP()
  84.  
  85. /////////////////////////////////////////////////////////////////////////////
  86. // CSystrayDlg message handlers
  87.  
  88. BOOL CSystrayDlg::OnInitDialog()
  89. {
  90.     CDialog::OnInitDialog();
  91.     CenterWindow();
  92.  
  93.     // Add "About..." menu item to system menu.
  94.  
  95.     // IDM_ABOUTBOX must be in the system command range.
  96.     ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  97.     ASSERT(IDM_ABOUTBOX < 0xF000);
  98.  
  99.     CMenu* pSysMenu = GetSystemMenu(FALSE);
  100.     CString strAboutMenu;
  101.     strAboutMenu.LoadString(IDS_ABOUTBOX);
  102.     if (!strAboutMenu.IsEmpty())
  103.     {
  104.         pSysMenu->AppendMenu(MF_SEPARATOR);
  105.         pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  106.     }
  107.     
  108.     // TODO: Add extra initialization here
  109.  
  110.     // Initialize the Win95SystemTray object.
  111.     VERIFY(m_Win95SystemTray.Attach(m_hWnd));
  112.     m_Win95SystemTray.RegisterCallbackMessage(WM_MYCALLBACK);
  113.  
  114.     m_editBubbleText.LimitText(63);
  115.  
  116.     // Process startup settings.
  117.     if (m_bLoadOnStartup)
  118.     {
  119.         OnEnable();
  120.  
  121.         if (m_bCycle)
  122.         {
  123.             OnCycle();
  124.         }
  125.     }
  126.     
  127.     return TRUE;  // return TRUE  unless you set the focus to a control
  128. }
  129.  
  130. void CSystrayDlg::OnSysCommand(UINT nID, LPARAM lParam)
  131. {
  132.     if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  133.     {
  134.         CAboutDlg dlgAbout;
  135.         dlgAbout.DoModal();
  136.     }
  137.     else
  138.     {
  139.         CDialog::OnSysCommand(nID, lParam);
  140.     }
  141. }
  142.  
  143. // If you add a minimize button to your dialog, you will need the code below
  144. //  to draw the icon.  For MFC applications using the document/view model,
  145. //  this is automatically done for you by the framework.
  146.  
  147. void CSystrayDlg::OnPaint() 
  148. {
  149.     if (IsIconic())
  150.     {
  151.         CPaintDC dc(this); // device context for painting
  152.  
  153.         SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  154.  
  155.         // Center icon in client rectangle
  156.         int cxIcon = GetSystemMetrics(SM_CXICON);
  157.         int cyIcon = GetSystemMetrics(SM_CYICON);
  158.         CRect rect;
  159.         GetClientRect(&rect);
  160.         int x = (rect.Width() - cxIcon + 1) / 2;
  161.         int y = (rect.Height() - cyIcon + 1) / 2;
  162.  
  163.         // Draw the icon
  164.         dc.DrawIcon(x, y, m_hIcon);
  165.     }
  166.     else
  167.     {
  168.         CDialog::OnPaint();
  169.     }
  170. }
  171.  
  172. HCURSOR CSystrayDlg::OnQueryDragIcon()
  173. {
  174.     return (HCURSOR) m_hIcon;
  175. }
  176.  
  177. void CSystrayDlg::OnHide()
  178. {
  179.     ShowWindow(SW_HIDE);
  180. }
  181.  
  182. void CSystrayDlg::OnSet() 
  183. {
  184.     m_editBubbleText.GetWindowText(m_szBubbleText);
  185.  
  186.     // Set the bubble text.
  187.     m_Win95SystemTray.ItemSetBubbleText(ID_MYSYSTRAYITEM, m_szBubbleText);
  188. }
  189.  
  190. void CSystrayDlg::OnEnable() 
  191. {
  192.     if (UpdateData())
  193.     {
  194.         if (m_bEnable)
  195.         {
  196.             m_Win95SystemTray.ItemAdd(ID_MYSYSTRAYITEM);
  197.             // no bubble text for now
  198.             m_Win95SystemTray.ItemModify(ID_MYSYSTRAYITEM, m_hIcon, NULL);
  199.         }
  200.         else
  201.         {
  202.             m_Win95SystemTray.ItemDelete(ID_MYSYSTRAYITEM);
  203.         }
  204.  
  205.         GetDlgItem(IDABORT)->EnableWindow(m_bEnable);
  206.     }
  207. }
  208.  
  209.  
  210. void CSystrayDlg::OnIconstate() 
  211. {
  212.     if (UpdateData())
  213.     {
  214.         // Note:  the bubble text gets reset every time the icon state
  215.         // is changed in the system tray.
  216.         HICON hNewIconToShowOnSystemTray =
  217.             AfxGetApp()->LoadIcon(MAKEINTRESOURCE(IDI_ICON1 + m_nIconState));
  218.         m_Win95SystemTray.ItemModify(ID_MYSYSTRAYITEM,
  219.             hNewIconToShowOnSystemTray);
  220.     }
  221. }
  222.  
  223. LONG CSystrayDlg::OnMySystemTrayCallback(UINT wParam, LONG lParam)
  224. {
  225.     switch (lParam)
  226.     {
  227.         case WM_LBUTTONDOWN:
  228.             // Usually nothing, but maybe show a scaled down version of
  229.             // the main window, like Volume Control does.
  230.             break;
  231.  
  232.         case WM_LBUTTONDBLCLK:
  233.             // Show the full application.
  234.             ShowWindow(SW_SHOW);
  235.             break;
  236.  
  237.         case WM_RBUTTONDOWN:
  238.             // Create context popup menu.
  239.             break;
  240.  
  241.         case WM_RBUTTONDBLCLK:
  242.             // Usually nothing, but we'll change the icon state.
  243.             m_nIconState = (m_nIconState + 1) % 16;
  244.             CheckRadioButton(IDRB_ICONSTATE, IDC_RADIO16,
  245.                 IDRB_ICONSTATE + m_nIconState);
  246.             OnIconstate();
  247.             OnSet();
  248.             break;
  249.     }
  250.  
  251.     return(1);
  252. }
  253.  
  254.  
  255. void CSystrayDlg::OnCycle() 
  256. {
  257.     if (UpdateData())
  258.     {
  259.         if (m_bCycle)
  260.         {
  261.             // Start the timer.
  262.             m_uMyTimer = SetTimer(ID_MYTIMER, 63, NULL);  // about 1/4 second
  263.         }
  264.         else
  265.         {
  266.             // Kill the timer.
  267.             m_uMyTimer = !KillTimer(ID_MYTIMER);
  268.         }
  269.     }
  270. }
  271.  
  272. void CSystrayDlg::OnClear() 
  273. {
  274.     m_szBubbleText.Empty();
  275.     m_editBubbleText.SetWindowText(m_szBubbleText);
  276.         
  277.     // Set the bubble text.  No bubble will display.
  278.     m_Win95SystemTray.ItemSetBubbleText(ID_MYSYSTRAYITEM, m_szBubbleText);
  279. }
  280.  
  281. void CSystrayDlg::OnTimer(UINT nIDEvent) 
  282. {
  283.     if (nIDEvent == ID_MYTIMER)
  284.     {
  285.         OnMySystemTrayCallback(WM_MYCALLBACK, WM_RBUTTONDBLCLK);
  286.     }
  287.     else
  288.     {
  289.         CDialog::OnTimer(nIDEvent);
  290.     }
  291. }
  292.  
  293. void CSystrayDlg::OnClose() 
  294. {
  295.     if (m_uMyTimer)
  296.     {
  297.         m_uMyTimer = !KillTimer(ID_MYTIMER);
  298.     }
  299.  
  300.     CDialog::OnClose();
  301. }
  302.  
  303. void CSystrayDlg::OnAbout() 
  304. {
  305.     CAboutDlg dlg;
  306.     dlg.DoModal();
  307. }
  308.  
  309. void CSystrayDlg::OnCancel() 
  310. {
  311.     if (!UpdateData())
  312.     {
  313.         return;
  314.     }
  315.  
  316.     AfxGetApp()->WriteProfileInt("CSysTray", "Load on Startup",
  317.         m_bLoadOnStartup);
  318.     AddToRunRegistryKey(m_bLoadOnStartup);
  319.  
  320.     CDialog::OnCancel();
  321. }
  322.  
  323. BOOL CSystrayDlg::OnQueryEndSession() 
  324. {
  325.     if (!UpdateData() || !CDialog::OnQueryEndSession())
  326.         return FALSE;
  327.  
  328.     // We want to see if we are marked to load on startup.  If so, then we
  329.     // want to make sure we put ourselves in the "Run" line of the registry,
  330.     // so Windows will get us started again.  This registry key is
  331.     //
  332.     //    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
  333.  
  334.     if (m_bLoadOnStartup)
  335.     {
  336.         AfxGetApp()->WriteProfileInt("CSysTray", "Cycle Icon",
  337.             m_bCycle);
  338.     }
  339.  
  340.     if (ERROR_SUCCESS != AddToRunRegistryKey(m_bLoadOnStartup))
  341.     {
  342.         // Do something appropriate to handle this.
  343.     }
  344.     
  345.     return TRUE;
  346. }
  347.  
  348. LONG CSystrayDlg::AddToRunRegistryKey(BOOL bAdd)
  349. {
  350.     HKEY hKey;
  351.     LONG lRet;
  352.  
  353.     if (ERROR_SUCCESS == (lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE,
  354.         "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", 0,
  355.         KEY_WRITE, &hKey)))
  356.     {
  357.         if (bAdd)
  358.         {
  359.             CString sPath;
  360.             char *p = sPath.GetBuffer(256);
  361.  
  362.             if (p != NULL)
  363.             {
  364.                 ::GetModuleFileName(NULL, p, 255);
  365.                 sPath.ReleaseBuffer();
  366.                 lRet = RegSetValueEx(hKey, "CSysTray", 0, REG_SZ,
  367.                     (CONST BYTE *) (LPCSTR) sPath, sPath.GetLength() + 1);
  368.             }
  369.             else
  370.             {
  371.                 lRet = 42;  // Hmmmmmm.
  372.             }
  373.         }
  374.         else
  375.         {
  376.             lRet = RegDeleteValue(hKey, "CSysTray");
  377.         }
  378.  
  379.         RegCloseKey(hKey);
  380.     }
  381.  
  382.     return(lRet);
  383. }
  384.  
  385. void CSystrayDlg::OnDevnotes() 
  386. {
  387.     CDialogDevelNotes dlg;
  388.     dlg.DoModal();
  389. }
  390.